import { CanActivate, ExecutionContext, Injectable } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { Request } from "express";
import { Observable } from "rxjs";

import { CONFIG_KEY } from "@/core/config/configurations";

import { AppUserType } from "../constants";

/**
 * 全局用户类型（前台用户、后台用户）检查守卫。目的：防止前台用户通过后台管理系统接口获取敏感信息。
 */
@Injectable()
export class UserTypeCheckGuard implements CanActivate {
    constructor(private readonly configService: ConfigService) {}

    canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
        const request: Request = context.switchToHttp().getRequest();
        const jwtPayload = request.user; // 从请求中获取解析后的JWT

        // 如果未携带 JWT，则不校验类型，直接通过。比如登录接口
        if (!jwtPayload) return true;

        const appUserType = jwtPayload.type; // 从 JWT 中获取用户类型 "admin" 或 "user"

        // 判断当前请求的目标是否为后台管理系统接口，以 URL 前缀 /admin 区分，比如 /admin/users
        const { appServerUrlPrefix } = this.configService.get(CONFIG_KEY.server);
        const adminSystemPrefixUrl = `/${appServerUrlPrefix}/admin`;

        // 前台用户不允许访问后台管理系统接口
        if (appUserType === AppUserType.FRONTEND_USER && request.url.startsWith(adminSystemPrefixUrl)) return false;

        return true;
    }
}
